% TODO proof-reading
\subsubsection{Простой пример}

Создадим массив из 10-и чисел и заполним его:

\begin{lstlisting}[style=customjava]
	public static void main(String[] args) 
	{
		int a[]=new int[10];
		for (int i=0; i<10; i++)
			a[i]=i;
		dump (a);
	}
\end{lstlisting}

\begin{lstlisting}
  public static void main(java.lang.String[]);
    flags: ACC_PUBLIC, ACC_STATIC
    Code:
      stack=3, locals=3, args_size=1
         0: bipush        10
         2: newarray       int
         4: astore_1      
         5: iconst_0      
         6: istore_2      
         7: iload_2       
         8: bipush        10
        10: if_icmpge     23
        13: aload_1       
        14: iload_2       
        15: iload_2       
        16: iastore       
        17: iinc          2, 1
        20: goto          7
        23: aload_1       
        24: invokestatic  #4     // Method dump:([I)V
        27: return        
\end{lstlisting}

Инструкция \TT{newarray} создает объект массива из 10 элементов типа \IT{int}.

Размер массива выставляется инструкцией \TT{bipush} и остается на \ac{TOS}.

Тип массива выставляется в операнде инструкции \TT{newarray}.

После исполнения \TT{newarray}, \IT{reference} (или указатель) только что созданного 
в куче (heap) массива остается на \ac{TOS}.

\TT{astore\_1} сохраняет \IT{reference} на него в первом слоте \ac{LVA}.

Вторая часть функции \main это цикл, сохраняющий значение \IT{i} в соответствующий
элемент массива.

\TT{aload\_1} берет \IT{reference} массива и сохраняет его в стеке.

\TT{iastore} затем сохраняет значение из стека в массив, 
\IT{reference} на который в это время находится на \ac{TOS}.

Третья часть функции \main вызывает функцию \TT{dump()}.

Аргумент для нее готовится инструкцией \TT{aload\_1} (смещение 23).

Перейдем к функции \TT{dump()}:

\begin{lstlisting}[style=customjava]
	public static void dump(int a[])
	{
		for (int i=0; i<a.length; i++)
			System.out.println(a[i]);
	}
\end{lstlisting}

\begin{lstlisting}
  public static void dump(int[]);
    flags: ACC_PUBLIC, ACC_STATIC
    Code:
      stack=3, locals=2, args_size=1
         0: iconst_0      
         1: istore_1      
         2: iload_1       
         3: aload_0       
         4: arraylength   
         5: if_icmpge     23
         8: getstatic     #2      // Field java/lang/System.out:Ljava/io/PrintStream;
        11: aload_0       
        12: iload_1       
        13: iaload        
        14: invokevirtual #3      // Method java/io/PrintStream.println:(I)V
        17: iinc          1, 1
        20: goto          2
        23: return        
\end{lstlisting}

Входящий \TT{reference} на массив в нулевом слоте.

Выражение \TT{a.length} в исходном коде конвертируется в инструкцию \TT{arraylength},
она берет \IT{reference} на массив и оставляет размер массива на \ac{TOS}.

Инструкция \TT{iaload} по смещеню 13 используется для загрузки элементов массива, 
она требует, чтобы в стеке присутствовал \IT{reference} на массив
(подготовленный \TT{aload\_0} на 11), 
а также индекс (подготовленный \TT{iload\_1} по смещеню 12).

Нужно сказать, что инструкции с префиксом \IT{a} могут быть неверно поняты, 
как инструкции работающие с массивами (\IT{array}).
Это неверно.

Эти инструкции работают с \IT{reference}-ами на объекты.

А массивы и строки это тоже объекты.
